package com.system.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.system.pojo.ParamsData;

import net.sf.json.JSONObject;

public class Tools {
	

	/**
	 * 随机生成六位数验证码 
	 * @return
	 */
	public static int getRandomNum(){
		 Random r = new Random();
		 return r.nextInt(900000)+100000;//(Math.random()*(999999-100000)+100000)
	}
	
	/**
	 * 检测字符串是否不为空(null,"","null")
	 * @param s
	 * @return 不为空则返回true，否则返回false
	 */
	public static boolean notEmpty(String s){
		return s!=null && !"".equals(s) && !"null".equals(s);
	}
	
	/**
	 * 检测字符串是否为空(null,"","null")
	 * @param s
	 * @return 为空则返回true，不否则返回false
	 */
	public static boolean isEmpty(String s){
		return s==null || "".equals(s) || "null".equals(s);
	}
	
	/**
	 * 字符串转换为字符串数组
	 * @param str 字符串
	 * @param splitRegex 分隔符
	 * @return
	 */
	public static String[] str2StrArray(String str,String splitRegex){
		if(isEmpty(str)){
			return null;
		}
		System.out.println(splitRegex);
		return str.split(splitRegex);
	}
	
	/**
	 * 用默认的分隔符(,)将字符串转换为字符串数组
	 * @param str	字符串
	 * @return
	 */
	public static String[] str2StrArray(String str){
		return str2StrArray(str,",\\s*");
	}
	
	/**
	 * 按照yyyy-MM-dd HH:mm:ss的格式，日期转字符串
	 * @param date
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String date2Str(Date date){
		return date2Str(date,"yyyy-MM-dd HH:mm:ss");
	}
	
	/**
	 * 按照yyyy-MM-dd HH:mm:ss的格式，字符串转日期
	 * @param date
	 * @return
	 */
	public static Date str2Date(String date){
		if(notEmpty(date)){
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			try {
				return sdf.parse(date);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return new Date();
		}else{
			return null;
		}
	}
	
	/**
	 * 按照参数format的格式，日期转字符串
	 * @param date
	 * @param format
	 * @return
	 */
	public static String date2Str(Date date,String format){
		if(date!=null){
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}else{
			return "";
		}
	}
	
	/**
	 * 把时间根据时、分、秒转换为时间段
	 * @param StrDate
	 */
	public static String getTimes(String StrDate){
		String resultTimes = "";
		
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	    java.util.Date now;
	    
	    try {
	    	now = new Date();
	    	java.util.Date date=df.parse(StrDate);
	    	long times = now.getTime()-date.getTime();
	    	long day  =  times/(24*60*60*1000);
	    	long hour = (times/(60*60*1000)-day*24);
	    	long min  = ((times/(60*1000))-day*24*60-hour*60);
	    	long sec  = (times/1000-day*24*60*60-hour*60*60-min*60);
	        
	    	StringBuffer sb = new StringBuffer();
	    	//sb.append("发表于：");
	    	if(hour>0 ){
	    		sb.append(hour+"小时前");
	    	} else if(min>0){
	    		sb.append(min+"分钟前");
	    	} else{
	    		sb.append(sec+"秒前");
	    	}
	    		
	    	resultTimes = sb.toString();
	    } catch (ParseException e) {
	    	e.printStackTrace();
	    }
	    
	    return resultTimes;
	}
	
	/**
	 * 
	 * 返回 JSON 格式对象
	 * 
	 * @param object
	 *            转换对象
	 * @return
	 */
	public static String toJson(Object object) {
		return JSON.toJSONString(object, SerializerFeature.BrowserCompatible);
	}

	/**
	 * 
	 * 返回 JSON 格式对象
	 * 
	 * @param object
	 *            转换对象
	 * @param features
	 *            序列化特点
	 * @return
	 */
	public static String toJson(Object object, String format) {
		if (format == null) {
			return toJson(object);
		}
		return JSON.toJSONStringWithDateFormat(object, format, SerializerFeature.WriteDateUseDateFormat);
	}
	
	/**
	 * 
	 * 返回 JSON 格式对象（bootstrap-table表格对象）
	 * 
	 * @param list
	 *            转换对象
	 * @param total
	 *            记录总数
	 * @return
	 */
	public static JSONObject pageJson(List list,long total) {
		JSONObject json=new JSONObject();
		json.put("total", total);
		json.put("rows", list);
		
		return json;
	}
	
	/**
	 *  处理地点设备树(高级查询)
	 * @return JSON对象
	 * @param field  字段名
	 * @param request 用来获取servletcontext
	 */
	public static String getPosDev(HttpServletRequest request,String typeString,List<ParamsData> posdevList) throws Exception{
		
		String []types=typeString.split(",");
		ServletContext application=request.getSession().getServletContext();
		
		List<Map<String,Object>> newCodeList=new ArrayList<Map<String,Object>>();
		//从内存中的数据字典中，获取出与type相同的设备类型，作为第一级
		List<Map<String, Object>> typeList=(List<Map<String, Object>>) application.getAttribute("codeList");
		for (Map<String, Object> mm : typeList) {
			String mmField=(String) mm.get("FIELD");
			if("EQUIPMENT_TYPE".equals(mmField)){
				for (String tt:types) {
					if(tt.equals(mm.get("CODE"))){
						Map<String, Object> newMm=new LinkedHashMap<String, Object>();
						newMm.put("name",mm.get("CODEDESC"));
						newMm.put("id", tt);
						newCodeList.add(newMm);
						break;
					}
				}
			}
		}
		
		//盛放设备类型，第一级
		List<Map<String, Object>> listType=new ArrayList<Map<String,Object>>();
		
		for(Map<String,Object> pdt:newCodeList){
			String type=(String) pdt.get("id");
			//盛放该类型下的地点，第二级
			List<Map<String,Object>> listPos=new ArrayList<Map<String,Object>>();
			for (ParamsData pdPos : posdevList) {
//				System.out.println("pdPos===================="+pdPos);
				String typeId=pdPos.getString("TYPE");
				if(typeId!=null&&typeId.equals(type)){		//如果typeid与第一级的typeid相等，就放到第一级的type下
					Map<String,Object> mapPos=new HashMap<String,Object>();
					String posid=pdPos.getString("POSID");
					mapPos.put("name", pdPos.getString("POSNAME"));
					mapPos.put("id", posid);
					
					//盛饭该类型下的、该地点下的设备，第三级
					List<Map<String,Object>> listDev=new ArrayList<Map<String,Object>>();
					for (ParamsData pdDev : posdevList) {
						String dposid=pdDev.getString("POSID");
						String dtype=pdDev.getString("TYPE");
						//如果typeid与第一级的typeid相等，而且posid与第二级中的地点的id相等，就放到第二级的地点下面
						if(dposid!=null&&dposid.equals(posid)&&dtype.equals(type)){		
							Map<String,Object> mapDev=new HashMap<String,Object>();
							mapDev.put("name", pdDev.getString("DEVNAME"));
							mapDev.put("id", pdDev.getString("DEVID"));
							mapDev.put("type",type);
							listDev.add(mapDev);
						}
					}
					mapPos.put("children", listDev);
					//如果存在，就不往list中放了
					boolean iden=true;
					for(Map<String,Object> map:listPos){
						if(map!=null&&map.equals(mapPos)){
							iden=false;
							break;
						}
					}
					if(iden==true){
						listPos.add(mapPos);
					}
				}
			}
			pdt.put("children",listPos);
			listType.add(pdt);
		}
		return Tools.toJson(listType);
	}
	
}
